﻿#ifndef _LOTTERT_H
#define _LOTTERT_H
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
#define USER_FILE			"./resource/save_file/user_file.db"
#define LOTTERY_FILE		"./resource/save_file/lottery_file.db"
#define HIS_LOTTERY_FILE	"./resource/save_file/hish_lottery_file.db"


//彩票信息结构

typedef enum {FALSE,TRUE} bool;                                        //bool类型的定义
typedef enum Lottery_type {L_sports,L_welfare,L_provide} L_type;       //彩票类型：体育彩票，福利彩票，救灾彩票
typedef struct Lottery {
	L_type Lty;				//彩票类型
	char L_name[100];		//彩票名称
	long date;				//发行期号
	long ID;				//发行期号
	int win_nums[5];		//中奖号码
	int L_unit_price;		//彩票单价
	int L_buyed_count;		//彩票已购买量
	float money;			//彩票池金额
	bool L_yn_open;			//彩票是否开奖,0 未开奖；1 已开奖
	struct Lottery* next;
}Lottery_t;

//用户（管理员 彩民 公正员）
/*
 关于用户，有三类，有一个管理员，一个公正员(可以扩展 0 - 1)，多个彩民组成.
 管理员的编号/ 公正员的编号：0 - 999
 彩  民的编号：1000 - n
	 linux用户管理的方式。
 */
//彩民信息

//已购彩票信息
typedef struct L_buyed 
{
	long date;				//发行期号
	long ID;				//彩票ID
	int chose_nums[5];		//彩民购买的号码
	int win_nums[5];		//中奖号码
	bool L_yn_open;			//彩票是否开奖
	int L_unit_price;		//彩票单价
	char buyer[100];		//买该彩票的彩民帐号
	float winner;			//中奖金额
	struct L_buyed* next;
}L_buyed_t;

typedef struct Buyer
{
	int ID;					//编号
	char B_name[100];		//用户帐号
	char B_passwd[100];		//用户密码
	int B_num[5];			//用户买的号码
	int B_count;			//用户购买的注数
	float B_remain_money;	//用户余额
	float B_win_money;		//用户中奖金额
	struct Buyer* next;		//下一个彩民
}Buyer_t;

//管理员
typedef struct Admin 
{
	int ID;					//编号
	char A_name[100];		//管理员帐号
	char A_passwd[100];	//用户密码
}Admin_t;


//公正员
typedef struct Justice 
{
	int ID;					//编号
	char J_name[100];		//公正员帐号
	char J_passwd[100];	//用户密码
}Justice_t;

/*
 注意：用户在注册时要加载用户文件（user_file.db）中的用户链表,自动加载生成用户链表（user_list
 ,user_head)。同理，登录时也要加载该文件。考虑到老用户的心态变化及新用户的好奇心理，宜采用头插
 法，让最新的用户在开始位置，所以在新用户登录时更快的匹配到，从而提高效率！
 */
//帮助
void show_help(void);
//用户相关函数：

void cleaninput(void);
void show_user_list(Buyer_t* user_head);
//用户文件加载
Buyer_t* init_user_list(void);								//用户链表初始化
Buyer_t* load_user(void);									//加载文件中的用户列表
void save_user_list(Buyer_t* user_head);					 //保存用户链表到文件（USER_FILE）

//注册及登录
Buyer_t* is_exists(Buyer_t* user_head,char *tmp);			//判断用户名是否存在 存在返回该节点指针，否则返还NULL
void user_reg(Buyer_t* user_head);							//注册
void user_login(Buyer_t* user_head);						//登录
int recharge(Buyer_t* user);								//用户充值

void pos_info(Buyer_t* userhead,Buyer_t* user);				//个人信息显示控制
void chpwd(Buyer_t* user);									//修改个人密码
void print_posinfo(Buyer_t* user);							//打印个人信息栏
void logoff(Buyer_t* user_head,Buyer_t* user);				//注销用户
void free_user_list(Buyer_t* user_head);					//用于用户链表的释放

//
Buyer_t* buy_lottery_center(Buyer_t* user);					//彩民购买彩票中心
L_buyed_t* init_buyed_lott(void);							//彩票池链表初始化
L_buyed_t* load_buyed_lott(void);							//加载彩票池
void buy_lottery(Buyer_t* user,Lottery_t* lott_head,L_buyed_t* buyed_head);		//彩民购买彩票
void show_hist_lott(Buyer_t* user,L_buyed_t* buyed_head);	//显示彩民买的彩票
void save_buylott_list(L_buyed_t* buyed_head);				//保存已买彩票的文件
void show_buylott_list(L_buyed_t* buyed_head);				//显示已购买的 彩票信息
void autochose( L_buyed_t* new_buy);						//机选彩票号
void selfchose( L_buyed_t* new_buy);                        //自选彩票号
void free_buylott_list(L_buyed_t* buyed_head);				//用于已买彩票链表的释放


//管理员相关函数：
//彩票文件加载
Lottery_t* init_lott_list(void);							//彩票链表的初始化
Lottery_t* load_lott(void);									//加载文件中到彩票列表
void load_lott_list(Lottery_t* lott_head,Lottery_t* cur);	//头查法生存彩票链表
//发布彩票
void admin_login(Buyer_t* usr_head);						//管理员登录
void add_lott_list(Lottery_t* lott_head);					//彩票发布控制
void release_lottery(Lottery_t* lott_head);					//发布新彩票
void save_lott_list(Lottery_t* lott_head);					//保存彩票链表到文件（LOTTERY_FILE）
void show_lott_list(Lottery_t* lott_head);					//显示已发布的彩票链表
void admin_deal_ctrl(Buyer_t *user_head);					//管理员对用户的处理
void sort_name(Buyer_t *user_head);							//对用户帐号排序
int myCmp_name(const void* pa,const void* pb);				//帐号排序比较
void sort_money(Buyer_t *user_head);						//对用户金额排序
int myCmp_money(const void* pa,const void* pb);				//金额排序比较
void show_arr(Buyer_t* arr,int count);								//显示结构体数组的数据
void free_lott_list(Lottery_t* lott_head);					//用于彩票链表的释放

//
void open_lott(Buyer_t* user_head,Lottery_t* lott_head);										//开奖
int checkwinner(int* chose_nums,int* win_nums);				//检测中奖号码
void insort(int *number);									//插入排序
#endif
